#ifndef EMBED_H_
#define EMBED_H_

#include "libepc.h"
#include "codepage.h"
#include "utypes.h"
#include "timer.h"
#include "sprite.h"
#include "serial.h"
#include <stdlib.h>
#include <stdio.h>

/** @defgroup Embed Embed
 * @{
 *
 * Embed related functions
 */


//ints
#define T0_IRQ    0  ///< Timer 0
#define KBD_IRQ   1  ///< keyboard       
#define COM2_IRQ  3  ///< serial port 2 
#define COM1_IRQ  4  ///< serial port 1  
#define FLP_IRQ   6  ///< floppy         
#define LPT_IRQ   7  ///< parallel port  
#define RTC_IRQ   8  ///< realtime clock 
#define MOUSE_IRQ 12 ///< mouse          
#define FPU_IRQ   13 ///< Floating point 
#define DISK1_IRQ 14 ///< Hard disk controller 1   
#define DISK2_IRQ 15 ///< Hard disk controller 2  

#define PIC1_MASK 0x21  ///< PIC1 register address to read/write interrupt mask */
#define PIC2_MASK 0xA1  ///< PIC2 register address to read/write interrupt mask */

#define IRQ_MASK_BIT(irq) ((irq) < 8 ? 1 << (irq) : (1 << (irq)) >> 8)

#define HRES 1024
#define VRES 768
#define COR_DE_TIJOLO 113

#define CHR_H 16


extern int msec;

extern int sec;

void asm_wait(void);

/** Mask the bit corresponding to 'irq', disabling its interrupts.
 * Returns the previous irq status
 * The correct PIC is used.
 * @param irq
 */
void mask_pic(int irq);

/** Unmask the bit corresponding to 'irq', enabling its interrupts.
 * The correct PIC is used.
 * @param irq
 */
void unmask_pic(int irq);


/** desenha um pixel com uma determinada cor no ecra, nas coordenadas (x,y).
* @param x posicao no eixo dos x
* @param y posicao no eixo dos y
* @param color cor
* @param base apontador para memoria de enderecos
*/
void set_pixel(int x, int y, int color, char *base);

/** devolve a cor do pixel que está na posicao (x,y)
* @return cor do pixel
*
* @param x posicao no eixo dos x
* @param y posicao no eixo dos y
* @param base apontador para memoria de enderecos
*/
int get_pixel(int x, int y, char *base);

/** pinta o ecra de uma determinada cor, dando o efeito de se ter "limpo" o ecra
* @param color cor
* @param base apontador para memoria de enderecos
*/
void clear_screen(char color, char *base);

/** desenha uma linha com uma cor entre as posicoes (xi,yi) e (xf,yf)
* @param xi posicao inicial no eixo dos x
* @param yi posicao inicial no eixo dos y
* @param xf posicao final no eixo dos x
* @param yf posicao final no eixo dos y
* @param color cor
* @param base apontador para memoria de enderecos
*/
void draw_line(int xi, int yi, int xf, int yf, int color, char *base);

/** Funçao que desenha um caracter numa determinada posicao
 *  @param c caracter a ser desenhado
 *  @param x posiçao no eixo dos x
 *  @param y posiçao no eixo dos y
 *  @param fore_color cor
 *  @param back_color cor de fundo do caracter
 *  @param char_scale tamanho do caracter
 *  @param video_base apontador para memória de endereços
 *  @param table apontador para tabela ASCII
 */
void drawCharAt(char c, int x, int y, int fore_color, int back_color, int char_scale, char *video_base, char *table);			

/** Funçao que desenha uma string numa determinada posiçao
 *  @param str string a ser desenhada
 *  @param x posiçao no eixo dos x
 *  @param y posiçao no eixo dos y
 *  @param fore_color cor
 *  @param back_color cor de fundo do caracter
 *  @param char_scale tamanho do caracter
 *  @param video_base apontador para memória de endereços
 *  @param table apontador para tabela ASCII
 */
void drawStringAt(char* str, int x, int y, int fore_color, int back_color, int char_scale, char *video_base, char *table);			

/** Funçao que desenha um inteiro numa determinada posição
 *  @param num número a ser desenhado
 *  @param x posiçao no eixo dos x
 *  @param y posiçao no eixo dos y
 *  @param fore_color cor
 *  @param back_color cor de fundo do caracter
 *  @param char_scale tamanho do caracter
 *  @param video_base apontador para memória de endereços
 *  @param table apontador para tabela ASCII
 */
void drawIntAt(int num, int x, int y, int fore_color, int back_color, int char_scale, char *video_base, char *table);

/** Funçao que desenha um título numa determinada posiçao
 *  @param title título a ser desenhado
 *  @param xi posição inicial no eixo dos x
 *  @param yi posição inicial no eixo dos y
 *  @param xf posição final no eixo dos x
 *  @param yf posição final no eixo dos y
 *  @param fore_color cor
 *  @param back_color cor de fundo do caracter
 *  @param base apontador para memória de endereços
 *  @param char_scale tamanho do caracter
 *  @param table apontador para tabela ASCII
 */
void drawTitle(char * title, int xi, int yi, int xf, int yf, int fore_color, int back_color, char * base, int char_scale, char * table);

/** Função que desenha uma circunferencia numa determinada posição
 *  @param x0 posição do centro no eixo dos x
 *  @param y0 posição do centro no eixo dos y
 *  @param radius raio
 *  @param color cor
 *  @param base apontador para memória de endereços
 */

void draw_circle(int x0, int y0, int radius , int color, char *base);


/** Função que desenha um caixa numa determinada posição
 *  @param xi posição inicial no eixo dos x
 *  @param yi posição inicial no eixo dos y
 *  @param xf posição final no eixo dos x
 *  @param yf posição final no eixo dos y
 *  @param fore_color cor
 *  @param  fill parametro para saber se o interior é pintado ou não
 *  @param base apontador para memória de endereços
 */
void drawBox( int xi, int yi, int xf, int yf, int fore_color, int fill , char * base );



/** Função que desenha o título carregado duma sprite
 *  @param x posição inicial no eixo dos x
 *  @param y posição inicial  no eixo dos y
 *  @param base apontador para memória gráfica
 */
void drawSpriteTitle( int x , int y , char * base );



#endif
